"""
配置
"""

import os

import yaml

import utils.enum_utils as enum
from my_typing import *

_ENV: str = os.getenv("ENV") or "DEV"
""" 当前的环境变量 """

if not _ENV:
    raise EnvironmentError("环境变量 ENV 未设置，请检查！")

if _ENV.lower() not in enum.Environment:
    raise EnvironmentError(f"环境变量 ENV 不正确，请检查：{_ENV}")

_CONFIG_PATH: Path = Path(__file__).resolve().parent / "configs" / f"{_ENV}.yaml"
""" 配置文件路径 """

with open(_CONFIG_PATH, "r", encoding="UTF-8") as f:
    _config: dict = yaml.load(f, Loader=yaml.FullLoader)


@final
class _Backend:
    """ 后端 配置 """

    HOST: Final[str] = _config["BACKEND"]["HOST"]
    """ 主机 IP 地址 """

    PORT: Final[int] = _config["BACKEND"]["PORT"]
    """ 端口号（默认为 8000） """

    URL: Final[str] = f"http://{HOST}:{PORT}"
    """ 后端 URL """


@final
class _Const:
    """ 常量 配置 """

    ENCODING: Final[str] = "UTF-8"
    """ 编码格式 """

    PROJECT_NAME: Final[str] = "EX"
    """ 项目名称 """

    ENV: Final[str] = _ENV
    """ 当前环境 """


@final
class _Format:
    """ 格式 配置 """

    DATE_FORMAT: Final[str] = "%Y-%m-%d"
    """
    日期格式

    YYYY-MM-DD
    """

    TIME_FORMAT: Final[str] = "%H:%M:%S"
    """
    时间格式

    HH:mm:ss
    """

    DATETIME_FORMAT: Final[str] = "%Y-%m-%d %H:%M:%S"
    """
    日期时间格式

    YYYY-MM-DD HH:mm:ss
    """

    DATETIME_FULL_FORMAT: Final[str] = "%Y-%m-%d %H:%M:%S.%f"
    """
    日期时间格式（完整）

    YYYY-MM-DD HH:mm:ss.SSS
    """


@final
class _Limit:
    """ 限制 配置 """

    MAX_FILE_SIZE: Final[int] = 1024 * 1024 * 1024
    """ 最大的文件大小（单位：字节）1G """


@final
class _MongoDB:
    """ MongoDB 配置 """

    HOST: Final[str] = _config["DB"]["MONGODB"]["HOST"]
    """ 主机 IP 地址 """

    PORT: Final[int] = _config["DB"]["MONGODB"]["PORT"]
    """ 端口号（默认为 27017） """

    DB_NAME: Final[str] = _config["DB"]["MONGODB"]["DB_NAME"]
    """ 库名 """

    USERNAME: Final[str] = _config["DB"]["MONGODB"]["USERNAME"]
    """ 用户名 """

    PASSWORD: Final[str] = _config["DB"]["MONGODB"]["PASSWORD"]
    """ 密码 """

    REPLICA_SET: Final[str] = _config["DB"]["MONGODB"]["REPLICA_SET"]
    """ 副本集 """

    URI: Final[str] = (
        f"mongodb://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/"
        if USERNAME and PASSWORD
        else f"mongodb://{HOST}:{PORT}/"
    )
    """ MongoDB 连接 URI（不包括库） """

    URI_WITH_REPLICA_SET: Final[str] = f"{URI}?replicaSet={REPLICA_SET}"
    """ MongoDB 副本集连接 URI（不包括库） """

    URL: Final[str] = f"{URI}{DB_NAME}"
    """ MongoDB 连接 URL """


@final
class _Path:
    """ 路径 配置 """

    ROOT_DIR: Final[Path] = Path(__file__).resolve().parent
    """ 项目根目录 """

    ENV_DIR: Final[Path] = ROOT_DIR / "configs"
    """ 配置文件目录 """

    DATA_DIR: Final[Path] = ROOT_DIR / "data"
    """ 数据文件目录 """

    LOG_DIR: Final[Path] = ROOT_DIR / "logs"
    """ 日志文件目录 """

    STATIC_DIR: Final[Path] = ROOT_DIR / "static"
    """ 静态文件目录 """

    ZIP_FILE_DIR: Final[Path] = STATIC_DIR / "zip_file"
    """ 压缩文件目录 """


@final
class _Regex:
    """ 正则 配置 """

    DATE_REGEX: Final[str] = r"\b\d{4}-\d{2}-\d{2}\b"
    """
    日期 正则

    - 格式: YYYY-MM-DD
    - eg: 2024-01-30
    """

    TIME_REGEX: Final[str] = r"\b\d{2}:\d{2}:\d{2}\b"
    """
    时间 正则

    - 格式: HH:mm:ss
    - eg: 14:04:28
    """

    DATETIME_REGEX: Final[str] = r"\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\b"
    """
    日期时间 正则

    - 格式: YYYY-MM-DD HH:mm:ss
    - eg: 2024-01-30 14:04:28
    """


@final
class _Security:
    """ 安全配置 """

    ALGORITHM: Final[str] = _config["SECURITY"]["ALGORITHM"]
    """ 加密算法 """

    SECRET_KEY: Final[str] = _config["SECURITY"]["SECRET_KEY"]
    """ 密钥（用于签名、加密等） """

    TOKEN_MAX_AGE: Final[int] = _config["SECURITY"]["TOKEN_MAX_AGE"]
    """ Token 有效时间（天） """


@final
class _ThirdPart:
    """ 第三方配置 """

    LOGFIRE_TOKEN: Final[str] = _config["THIRD_PARTY"]["LOGFIRE"]["TOKEN"]
    """ logfire Token """


@final
class settings:  # noqa: ignore[func name]
    """ 项目配置 """

    BACKEND: Final[_Backend] = _Backend
    """ 后端 配置 """

    CONST: Final[_Const] = _Const
    """ 常量 配置 """

    LIMIT: Final[_Limit] = _Limit
    """ 限制 配置 """

    MONGODB: Final[_MongoDB] = _MongoDB
    """ MongoDB 配置 """

    PATH: Final[_Path] = _Path
    """ 路径 配置 """

    REGEX: Final[_Regex] = _Regex
    """ 正则 配置 """

    SECURITY: Final[_Security] = _Security
    """ 安全 配置 """

    FORMAT: Final[_Format] = _Format
    """ 格式 配置 """

    THIRD_PART: Final[_ThirdPart] = _ThirdPart
    """ 第三方 配置 """


if __name__ == "__main__":
    from devtools import debug

    debug(settings.MONGODB.__dict__)
    debug(settings.CONST.__dict__)
